package com.food.eat.impl;

import cn.hutool.core.date.DateUtil;
import com.food.eat.dto.UsersDto;
import com.food.eat.enums.Sex;
import com.food.eat.mapper.UsersMapper;
import com.food.eat.pojo.Users;
import com.food.eat.pojo.bo.UserBO;
import com.food.eat.service.UserService;
import com.food.eat.util.MD5Util;
import org.n3r.idworker.Sid;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.security.NoSuchAlgorithmException;
import java.util.Date;

/**
 * @Author:RenPu
 * @Date: 2020/7/19 12:20
 * @Version: 1.0
 * @description:
 */

@Service
public class UserServiceImpl implements UserService {


    /**
     * 事务的传播属性---->
     * REQUIRED: 使用当前的事务，如果当前没有事务，负责自己创建一个事务，
     * 子方法必须运行在一个事务中的，如果当前有事务则进行加入成为一个整体、
     * 例子：领导没有饭吃，我有钱，我会自己买了自己吃，领导有的吃，则会分给你吃
     * SUPPORTS: 如果当前有事务，则使用当前事务，如果当前没有事务，则不使用事务
     * 例子：领导没有饭吃，我也没饭吃，领导有饭吃，我也有饭吃
     * MANDATORY: 强制必须有一个事务，如果没事务支持，就抛出异常
     * 例子： 领导必须管饭，如果不管饭，我就不干了（就抛出异常）
     * REQUIRES_NEW: 如果有事务将事务挂起，自己创建一个事务给自己用
     * 例子；领导有饭吃，我偏不要，我自己买了自己吃
     * NOT_SUPPORTED: 如果用事务，则把当前事务挂起，自己不使用事务去操作数据库
     * 例子：领导有饭吃，分给你一点，你太忙了，放一边，你不吃
     * NEVER: 不允许事务，有事务就报异常
     * 例子： 领导有饭吃，分给你吃，你太忙了，你热爱工作
     * NESTED:
     * 例子：领导犯错了，惩罚我，我犯错了，领导甩锅给我
     */


    @Resource
    private UsersMapper usersMapper;


    //获取全局唯一id值，所需的依赖
    @Resource
    private Sid sid;


    /**
     * 查询用户名称是否存在
     *
     * @param username
     * @return
     */

    @Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public boolean queryUserName(String username) {

        Example userExample = new Example(Users.class);

        Example.Criteria userCriteria = userExample.createCriteria();

        userCriteria.andEqualTo("username", username);


        Users result = usersMapper.selectOneByExample(userExample);
        return result == null ? false : true;
    }


    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public Users createUser(UserBO userBO) {

        Users users = new Users();
        users.setUsername(userBO.getUsername());
        try {
            users.setPassword(MD5Util.getMD5Str(userBO.getPassword()));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        //默认昵称和用户名称相同
        users.setNickname(userBO.getUsername());

        //默认生日
        users.setBirthday(DateUtil.parse("1998-10-10"));

        users.setFace("asdgfasdfasdfasdfasdf");

        //默认性别
        users.setSex(Sex.WOMAN.type);

        String userId = sid.nextShort();

        users.setId(userId);

        users.setCreatedTime(new Date());

        users.setUpdatedTime(new Date());


        usersMapper.insert(users);


        //返回前端用于，回显数据
        return users;
    }


    /**
     * 用户的登录方法
     *
     * @param username
     * @param password
     * @return
     */

    @Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public Users login(String username, String password) {

        Example userExample = new Example(Users.class);

        Example.Criteria userCriteria = userExample.createCriteria();

        userCriteria.andEqualTo("username", username);
        userCriteria.andEqualTo("password", password);

        Users users = usersMapper.selectOneByExample(userExample);

        return users;


    }

    /**
     * 用户的登录方法
     *
     * @param username
     * @return
     */

    @Override
    public boolean queryUserNameModel(String username) {
        return UsersDto.queryUserName(usersMapper, username);
    }
}
